 #!/bin/bash

###############################################################################################
#                                                                                             #
# This script is used for MySQL daily backup. it is a package of Xtrabackup shell script      #
#                                                                                             #
# #############################################################################################
#                                                                                             #
# ScriptName            :    mysql_backup.sh                                                  #
# Author                :    Matnix                                                           #
# CerateDate            :    2017-06-08                                                       #
#********************************************************************************             #
# Version        Modified Date            Description                                         #
#********************************************************************************             #
#                                                                                             #
###############################################################################################



BACKUP_DATE=$(date +%Y-%m-%d_%H_%M_%S)
BACKUP_DIR=/data/mysql_db_backup
FULLBACKUP_PATH=$BACKUP_DIR/full
INCRBACKUP_PATH=$BACKUP_DIR/incr
BACKUP_LOG_PATH=$BACKUP_DIR/logs
BACKUP_KEEP_DAY=10
MYSQL_CONF=/etc/my.cnf
INNOBACKUPEX=/usr/bin/innobackupex
MYSQL_CMD=/usr/bin/mysql
MYSQL_CONNECT="--host=127.0.0.1 --user=root --password=xxx --port=3306"

error()
{
 echo "$1" 1>&2
 exit 1
}

#before the backup, check the system enviroment setting and mysql status and so on
mysql_backup_check()
{

    if [ ! -d $FULLBACKUP_PATH ];then
        mkdir -p $FULLBACKUP_PATH
    fi

    if [ ! -d $INCRBACKUP_PATH ];then
        mkdir -p $INCRBACKUP_PATH
    fi

    if [ ! -d $BACKUP_LOG_PATH ];then
        mkdir -p $BACKUP_LOG_PATH
    fi


    if [ ! -x $INNOBACKUPEX ];then
       error "$INNOBACKUPEX did not exists"
    fi

    if [ ! -x $MYSQL_CMD ];then
       error "mysql client did not exists!"
    fi

     mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`

        if [ "$mysql_status" != "Yes" ];then
          error "MySQL did not start. please check it"
        fi

        if ! `echo 'exit' | $MYSQL_CMD -s $MYSQL_CONNECT` ; then
         error "please check the user and password is correct!"
        fi
}


xtra_backup()
{
  if [ $# = 2 ];then
        $INNOBACKUPEX --defaults-file=$MYSQL_CONF $MYSQL_CONNECT  --no-timestamp  $1/full_$BACKUP_DATE>$2 2>&1
  elif [ $# = 3 ];then
        $INNOBACKUPEX  --defaults-file=$MYSQL_CONF $MYSQL_CONNECT  --no-timestamp --incremental  $1/incr_$BACKUP_DATE  --incremental-basedir $2 >$3 2>&1
  else
      error "the parameter is not correct"
  fi
}


lastest_fullback_dir()
{
    if [ -d $1 ]; then
        path=`ls -t $1 |head -n 1`
        if [  $path ]; then
            echo $path
        else
            error "lastest_fullback_dir(): 目录为空,没有最新目录"
        fi
    else
        error "lastest_fullback_dir(): 目录不存在或者不是目录"
    fi
}


mysql_full_backup()
{
    xtra_backup  $FULLBACKUP_PATH $BACKUP_LOG_PATH/full_$BACKUP_DATE.log

    if [ "${PIPESTATUS[0]}" -ne 0 ]; then
        (echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
      cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
    )     else
      (echo "Subject: MySQL Backup Success: MySQL Backup Succeed on `hostname`";
      cat ${BACKUP_LOG_PATH}/full_${BACKUP_DATE}.log;
    )
    fi


    #cd $FULLBACKUP_PATH

    #ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf
    find ${FULLBACKUP_PATH} -name '*' -mtime +$BACKUP_KEEP_DAY  -exec rm -rf {} \;
}

mysql_incr_backup()
{

  LATEST_FULL_BACKUP=`find $FULLBACKUP_PATH -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`

  LATEST_FULL_BACKUP_TIME=`stat -c %Y $FULLBACKUP_PATH/$LATEST_FULL_BACKUP`

  if [ $LATEST_FULL_BACKUP ];then
        #不是第一次增量备份，以最新的增量备份目录为base_dir
        xtra_backup $INCRBACKUP_PATH  $FULLBACKUP_PATH/`lastest_fullback_dir $FULLBACKUP_PATH`  $BACKUP_LOG_PATH/incr_$BACKUP_DATE.log
  else
        # the first incremental backup need do full backup first
         xtra_backup $FULLBACKUP_PATH  $BACKUP_LOG_PATH/full_$BACKUP_DATE.log

         if [ "${PIPESTATUS[0]}" -ne 0 ]; then
                        (echo "Subject: MySQL Backup Failed: MySQL Backup failed on `hostname`";
                   cat ${BACKUP_LOG_PATH}/incr_${BACKUP_DATE}.log;
                    )
         fi
  fi

  #cd ${INCRBACKUP_PATH}
  #ls -t | tail -n +$BACKUP_KEEP_DAY | xargs rm -rf
  find ${INCRBACKUP_PATH}  -name '*' -mtime +$BACKUP_KEEP_DAY  -exec rm -rf {} \;

}



case $1 in

       full)
          mysql_backup_check
          mysql_full_backup
          ;;

        incr)
          mysql_backup_check




          mysql_incr_backup

          ;;

         *)
          echo "full backup"
          echo "incr backup"
          ;;
esac
